package uiMain;

import java.util.LinkedList;

public class MenuDeConsola {

    protected LinkedList<OpcionDeMenu> listaOpciones;

    //Para el menú inicial, sin iniciar sesión
    public MenuDeConsola() {
        listaOpciones = new LinkedList();

        listaOpciones.add(new OpcionLogin());
        listaOpciones.add(new OpcionPedirCita());
        listaOpciones.add(new OpcionSalir());
    }

    //Para un menú acorde al nivel de acceso del usuario (funcionario, funcionario jefe, cliente, administrador...)
    public MenuDeConsola(byte nivelDeAcceso) {
        listaOpciones = new LinkedList();

        switch (nivelDeAcceso) {
            case 2: //Caso cliente registrado pero sin rol
                listaOpciones.add(new OpcionCerrarSesion());
                listaOpciones.add(new OpcionSalir());
                break;
            case 3: //Caso cliente demandante
                listaOpciones.add(new OpcionMostrarPropiedadesContratadas());
                listaOpciones.add(new OpcionCerrarSesion());
                listaOpciones.add(new OpcionSalir());
                break;
            case 4: //Caso cliente oferente
                listaOpciones.add(new OpcionListarPropiedadesConsignadas());
                listaOpciones.add(new OpcionCerrarSesion());
                listaOpciones.add(new OpcionSalir());
                break;
            case 5: //Caso funcionario
                listaOpciones.add(new OpcionRegistrarNuevoCliente());
                listaOpciones.add(new OpcionAsignarRolAUnCliente());
                listaOpciones.add(new OpcionListarClientesDemandantes());
                listaOpciones.add(new OpcionRegistrarUnInmueble());
                listaOpciones.add(new OpcionAsignarRolAUnaPropiedad());
                listaOpciones.add(new OpcionBuscarPropiedadPorCodigo());
                listaOpciones.add(new OpcionBuscarPropiedadPorCriterios());
                listaOpciones.add(new OpcionRegistrarNegocio());
                listaOpciones.add(new OpcionConsultarSalario());
                listaOpciones.add(new OpcionCerrarSesion());
                listaOpciones.add(new OpcionSalir());
                break;
            case 6://Funcionario jefe
                listaOpciones.add(new OpcionRegistrarNuevoCliente());
                listaOpciones.add(new OpcionAsignarRolAUnCliente());
                listaOpciones.add(new OpcionListarClientesDemandantes());
                listaOpciones.add(new OpcionRegistrarUnInmueble());
                listaOpciones.add(new OpcionAsignarRolAUnaPropiedad());
                listaOpciones.add(new OpcionBuscarPropiedadPorCodigo());
                listaOpciones.add(new OpcionBuscarPropiedadPorCriterios());
                listaOpciones.add(new OpcionRegistrarNegocio());
                listaOpciones.add(new OpcionConsultarSalario());
                listaOpciones.add(new OpcionRegistrarFuncionario());
                listaOpciones.add(new OpcionListarFuncionarios());
                listaOpciones.add(new OpcionListarClientesDeSubordinados());
                listaOpciones.add(new OpcionCerrarSesion());
                listaOpciones.add(new OpcionSalir());
                break;
            case 7://Caso administrador
                listaOpciones.add(new OpcionListarOpcionesDeAlguien());
                listaOpciones.add(new OpcionMostrarTodasLasOpciones());
                listaOpciones.add(new OpcionAgregarOpcion());
                listaOpciones.add(new OpcionEliminarOpcion());
                listaOpciones.add(new OpcionCerrarSesion());
                listaOpciones.add(new OpcionSalir());
                break;
            case 8://Únicamente para crear un menu que liste todas las posibilidades. Sólo para mostrarlas

                //Para los usuarios no registrados
                listaOpciones.add(new OpcionPedirCita());
                
                //Para los clientes demandantes
                listaOpciones.add(new OpcionMostrarPropiedadesContratadas());

                //Para los clientes oferentes
                listaOpciones.add(new OpcionListarPropiedadesConsignadas());

                //Para los funcionarios "estándar"
                listaOpciones.add(new OpcionRegistrarNuevoCliente());
                listaOpciones.add(new OpcionAsignarRolAUnCliente());
                listaOpciones.add(new OpcionListarClientesDemandantes());
                listaOpciones.add(new OpcionRegistrarUnInmueble());
                listaOpciones.add(new OpcionAsignarRolAUnaPropiedad());
                listaOpciones.add(new OpcionBuscarPropiedadPorCodigo());
                listaOpciones.add(new OpcionBuscarPropiedadPorCriterios());
                listaOpciones.add(new OpcionRegistrarNegocio());
                listaOpciones.add(new OpcionConsultarSalario());

                //Para los funcionarios jefes, todo lo de los funcionarios estándar + las siguientes
                listaOpciones.add(new OpcionRegistrarFuncionario());
                listaOpciones.add(new OpcionListarFuncionarios());
                listaOpciones.add(new OpcionListarClientesDeSubordinados());

                //Para el administrador del sistema
                listaOpciones.add(new OpcionListarOpcionesDeAlguien());
                listaOpciones.add(new OpcionMostrarTodasLasOpciones());
                listaOpciones.add(new OpcionAgregarOpcion());
                listaOpciones.add(new OpcionEliminarOpcion());

                //Para todos
                listaOpciones.add(new OpcionLogin());
                listaOpciones.add(new OpcionCerrarSesion());
                listaOpciones.add(new OpcionSalir());

                break;
            default:
                return;
        }
    }

    public void mostrarMenu() {

        for (int i = 0; i < this.listaOpciones.size(); i++) {
            System.out.print(String.format("%2d", (i + 1)));
            System.out.println(this.listaOpciones.get(i));
        }
    }

    public void mostrarMenuSinCerrarSesionYSalir() {
        for (int i = 0; i < this.listaOpciones.size() - 2; i++) {
            System.out.print(String.format("%2d", (i + 1)));
            System.out.println(this.listaOpciones.get(i));
        }
    }

    public void mostrarSoloTitulos() {
        for (int i = 0; i < this.listaOpciones.size(); i++) {
            System.out.println(this.listaOpciones.get(i).toStringParaMostrarElNivel());            
        }
    }

    public void eliminarOpcion(byte opcionAEliminar) {
        this.listaOpciones.remove(opcionAEliminar - 1);
    }

    public void agregarOpcion(OpcionDeMenu nuevaOpcion) {
        this.listaOpciones.add(this.getNumeroDeOpciones() - 2, nuevaOpcion);

    }

    public byte getNumeroDeOpciones() {
        return (byte) this.listaOpciones.size();
    }

    public LinkedList<OpcionDeMenu> getListaDeOpciones() {
        return this.listaOpciones;
    }

}
